home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / dev_libs / feelin040718 / sources / shade / draw.c < prev    next >
C/C++ Source or Header  |  2004-08-03  |  7KB  |  259 lines

  1. #include "Private.h"
  2.  
  3. #define FF_DRAWBORDER_UP                        (1L << 0)
  4. #define FF_DRAWBORDER_DOWN                      (1L << 1)
  5. #define FF_DRAWBORDER_SEPARE                    (1L << 2)
  6. #define FF_DRAWBORDER_SIZEGAD                   (1L << 3)
  7.  
  8. ///Shade_DrawBorder
  9. void Shade_DrawBorder(struct FeelinClass *Class,FObject Obj,struct RastPort *rp,ULONG *pn,ULONG Flags)
  10. {
  11.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  12.  
  13.    WORD x1 = _x, x2 = _x2, ix1 = _mx - 1, ix2 = _mx2 + 1,
  14.         y1 = _y, y2 = _y2, iy1 = _my - 1, iy2 = _my2 + 1;
  15.  
  16.  
  17.    if (FF_DRAWBORDER_UP & Flags)
  18.    {
  19.       _APen(pn[FV_Pen_Dark]);
  20.       _Line(x1,iy1,x1,y1); _Draw(x2,y1); _Draw(x2,iy1);
  21.       _Line(ix1,iy1,ix2,iy1);
  22.  
  23.       _APen(pn[FV_Pen_Shine]);
  24.       _Line(x1+1,iy1,x1+1,y1+1); _Draw(x2-2,y1+1); _Plot(ix2+1,iy1);
  25.  
  26.       _APen(pn[FV_Pen_Shadow]);
  27.       _Line(ix1,iy1-1,ix2,iy1-1); _Plot(ix1-1,iy1); _Plot(ix1-1,iy1-1);
  28.       _Line(x2-1,y1+2,x2-1,iy1);
  29.  
  30.       _APen(pn[FV_Pen_Fill]);
  31.       _Boxf(x1+2,y1+2,ix1-2,iy1);
  32.       _Boxf(ix2+2,y1+2,x2-2,iy1); _Plot(ix2+1,iy1-1); _Plot(x2-1,y1+1);
  33.       _Boxf(ix1-1,y1+2,ix2+1,iy1-2);
  34.    }
  35.  
  36.    if (FF_DRAWBORDER_DOWN & Flags)
  37.    {
  38.       _APen(pn[FV_Pen_Dark]);
  39.       _Line(x1,iy1+1,x1,y2); _Draw(x2,y2); _Draw(x2,iy1+1);
  40.       _Line(ix1,iy1+1,ix1,iy2); _Draw(ix2,iy2); _Draw(ix2,iy1+1);
  41.  
  42.       _APen(pn[FV_Pen_Shine]);
  43.       _Line(x1+1,iy1+1, x1+1,y2-2);
  44.       _Line(ix1,iy2+1,  ix2+1,iy2+1); _Draw(ix2+1,iy1+1);
  45.  
  46.       _APen(pn[FV_Pen_Shadow]);
  47.       _Line(ix1-1,iy1+1,ix1-1,iy2);
  48.       _Line(x1+2,y2-1,x2-1,y2-1); _Draw(x2-1,iy1+1);
  49.  
  50.       _APen(pn[FV_Pen_Fill]);
  51.       _Plot(x1+1,y2-1); _Plot(ix1-1,iy2+1);
  52.       _Boxf(x1+2,iy1+1, ix1-2,iy2+1);
  53.       _Boxf(x1+2,iy2+2, x2-2,y2-2);
  54.       _Boxf(ix2+2,iy1+1,   x2-2,iy2+1);
  55.    }
  56.  
  57.    if (FF_DRAWBORDER_SEPARE & Flags)
  58.    {
  59.       _APen(pn[FV_Pen_Shine]);
  60.       _Line(x1+2,iy1+1,ix1-2,iy1+1);
  61.       _Line(ix2+2,iy1+1,x2-2,iy1+1);
  62.       _APen(pn[FV_Pen_Fill]);
  63.       _Plot(ix1-1,iy1+1); _Plot(x2-1,iy1+1);
  64.    }
  65.  
  66.    if (FF_DRAWBORDER_SIZEGAD & Flags)
  67.    {
  68.       WORD x = x2 - SIZE + 1,
  69.            y = y2 - SIZE + 1;
  70.  
  71.       _APen(pn[FV_Pen_Dark]);   _Line(x,iy2+1,    x,y2);     _Line(ix2+1,y,     x2,y);
  72.       _APen(pn[FV_Pen_Shine]);  _Line(ix2+1,y+1,  x2-1,y+1); _Line(x+1,y2-1,    x+1,iy2+1);
  73.       _APen(pn[FV_Pen_Shadow]); _Line(x-1,iy2+2,  x-1,y2-1); _Line(ix2+2,y-1,   x2-1,y-1);
  74.       _APen(pn[FV_Pen_Fill]);   _Plot(x-1,iy2+1);   _Plot(x+1,y2-1);   _Plot(x2-1,y+1);    _Plot(ix2+1,y-1);
  75.    }
  76. }
  77. //+
  78.  
  79. ///Shade_DrawActive
  80. SAVEDS void Shade_DrawActive(struct FeelinClass *Class,APTR Obj,ULONG Flags)
  81. {
  82.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  83.    struct RastPort        *rp = _rp;
  84.    ULONG                  *pn = LOD -> AScheme -> Pens;
  85.    WORD                    x1 = _x, x2 = _x2, ix1 = _mx - 1, ix2 = _mx2 + 1,
  86.                            y1 = _y, /*y2 = _y2,*/ iy1 = _my - 1/*, iy2 = _my2 + 1*/;
  87.  
  88.    ULONG simple_flags = FF_DRAWBORDER_DOWN;
  89.  
  90.    if (LOD -> LastDrawn == FV_Shade_LastDrawn_Active) return;
  91.  
  92.    _render -> Palette = LOD -> AScheme;
  93.  
  94.    if (LOD -> Gad_Dragbar)
  95.    {
  96.       FObject   gad;
  97.       FAreaData *gad_ad = (FAreaData *)((ULONG)(LOD -> Gad_Dragbar) + FC_Area_Offset);
  98.  
  99.       WORD dx1 = gad_ad -> Box.x - 1,
  100.            dx2 = dx1 + gad_ad -> Box.w + 1;
  101.  
  102.       struct FeelinRender *renderbuf=NULL;
  103.       
  104.       if (FF_SHADE_BUFFER & LOD -> Flags)
  105.       {
  106.          if (x1 == 0 && y1 == 0)
  107.          {
  108.             if (renderbuf = CreateRenderBuffer(x2 - x1 + 1,iy1 + 1,_render))
  109.             {
  110.                rp = renderbuf -> RPort;
  111.             }
  112.          }
  113.       }
  114.  
  115.       _APen(pn[FV_Pen_Dark]);
  116.       _Line( x1,iy1,  x1, y1); _Draw(x2,y1) ; _Draw(x2,iy1);
  117.       _Line(ix1,iy1, ix2,iy1);
  118.       _Line(dx1,y1+1,dx1,iy1-1);
  119.       _Line(dx2,y1+1,dx2,iy1-1);
  120.  
  121.       _APen(pn[FV_Pen_Shine]);
  122.       _Line(x1+1,iy1,x1+1,y1+1); _Draw(dx1-2,y1+1);
  123.       _Line(dx2+1,iy1,dx2+1,y1+1); _Draw(x2-2,y1+1);
  124.  
  125.       _APen(pn[FV_Pen_Shadow]);
  126.       _Line(dx1-1,iy1,dx1-1,y1+2);
  127.       _Line(x2-1,iy1,x2-1,y1+2);
  128.  
  129.       _APen(pn[FV_Pen_Fill]);
  130.       _Line(x1+2,iy1,ix1-2,iy1);
  131.       _Line(ix2+2,iy1,x2-2,iy1);
  132.       _Boxf(x1+2,y1+2,dx1-2,iy1-1); _Plot(dx1-1,y1+1);
  133.       _Boxf(dx2+2,y1+2,x2-2,iy1-1); _Plot(x2-1,y1+1);
  134.  
  135.       if (LOD -> Gad_Close || LOD -> Gad_Iconify)
  136.       {
  137.          _APen(pn[FV_Pen_Dark]);    _Plot(dx1-1,iy1);
  138.          _APen(pn[FV_Pen_Shadow]);  _Plot(ix1-1,iy1); _Line(ix1-1,iy1-1,dx1-1,iy1-1);
  139.       }
  140.  
  141.       if (LOD -> Gad_Zoom || LOD -> Gad_Depth)
  142.       {
  143.          _APen(pn[FV_Pen_Dark]);    _Plot(dx2+1,iy1);
  144.          _APen(pn[FV_Pen_Shadow]);  _Line(dx2+2,iy1-1,ix2,iy1-1);
  145.          _APen(pn[FV_Pen_Shine]);   _Plot(ix2+1,iy1);
  146.          _APen(pn[FV_Pen_Fill]);    _Plot(dx2+1,iy1-1);
  147.       }
  148.  
  149.       {
  150.          gad = (FObject) F_Get(Obj,FA_Group_Head);
  151.  
  152.          while (gad)
  153.          {
  154.    //         F_DebugOut(0,"%s{%08lx}.DrawActive() - Gad %s{%08lx} - Pens 0x%08lx (APens 0x%08lx)\n",_classname(Obj),Obj,_classname(gad),gad,_render(gad) -> Pens,LOD -> AScheme);
  155.  
  156.             gad_ad = (FAreaData *) F_Get(gad,FA_AreaData);
  157.  
  158.             if (renderbuf)
  159.             {
  160.                struct FeelinRender *orender = gad_ad -> Render;
  161.  
  162.                gad_ad -> Render = renderbuf;
  163.  
  164.                F_Draw(gad,FF_Draw_Object);
  165.  
  166.                gad_ad -> Render = orender;
  167.             }
  168.             else
  169.             {
  170.                F_Draw(gad,FF_Draw_Object);
  171.             }
  172.  
  173.             gad = gad_ad -> Next;
  174.          }
  175.       }
  176.  
  177.       if (renderbuf)
  178.       {
  179.          ClipBlit(rp,0,0,_rp,x1,y1,x2 - x1 + 1,iy1 + 1,0x0C0);
  180.          DeleteRenderBuffer(renderbuf);
  181.          rp = _rp;
  182.       }
  183.    }
  184.    else
  185.    {
  186.       simple_flags |= FF_DRAWBORDER_UP;
  187.    }
  188.  
  189.    if (!F_Get(LOD -> Gad_Size,FA_Hidden))
  190.    {
  191.       simple_flags |= FF_DRAWBORDER_SIZEGAD;
  192.    }
  193.  
  194.    Shade_DrawBorder(Class,Obj,rp,pn,simple_flags);
  195.  
  196.    LOD -> LastDrawn = FV_Shade_LastDrawn_Active;
  197. }
  198. //+
  199. ///Shade_DrawInactive
  200. SAVEDS void Shade_DrawInactive(struct FeelinClass *Class,APTR Obj,ULONG Flags)
  201. {
  202.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  203.    struct RastPort        *rp  = _rp;
  204.    ULONG                  *pn  = LOD -> IScheme -> Pens;
  205.    WORD                    x1 = _x, x2 = _x2,
  206.                            y1 = _y, iy1 = _my - 1;
  207.  
  208.    ULONG simple_flags = FF_DRAWBORDER_DOWN;
  209.  
  210.    if (LOD -> LastDrawn == FV_Shade_LastDrawn_Inactive) return;
  211.  
  212.    _render -> Palette = LOD -> IScheme;
  213.  
  214.    if (LOD -> Gad_Dragbar)
  215.    {
  216.       struct FeelinRender *render_buf = NULL,
  217.                           *old_render = _render;
  218.  
  219.       FAreaData *gad_ad = (FAreaData *) F_Get(LOD -> Gad_Dragbar,FA_AreaData);
  220.  
  221.       if (FF_SHADE_BUFFER & LOD -> Flags)
  222.       {
  223.          if (x1 == 0 && y1 == 0)
  224.          {
  225.             if (render_buf = CreateRenderBuffer(x2 - x1 + 1,iy1 + 1,_render))
  226.             {
  227.                gad_ad -> Render = render_buf; rp = render_buf -> RPort;
  228.             }
  229.          }
  230.       }
  231.  
  232.       _APen(pn[FV_Pen_Dark]);
  233.       _Line(x1,iy1,x1,y1); _Draw(x2,y1); _Draw(x2,iy1); _Draw(x1,iy1);
  234.  
  235.       F_Draw(LOD -> Gad_Dragbar,FF_Draw_Object);
  236.  
  237.       if (render_buf)
  238.       {
  239.          gad_ad -> Render = old_render;
  240.  
  241.          ClipBlit(rp,0,0,_rp,0,0,x2 - x1 + 1,iy1 + 1,0x0C0);
  242.          DeleteRenderBuffer(render_buf);
  243.          rp = _rp;
  244.       }
  245.  
  246.       simple_flags |= FF_DRAWBORDER_SEPARE;
  247.    }
  248.    else
  249.    {
  250.       simple_flags |= FF_DRAWBORDER_UP;
  251.    }
  252.  
  253.    Shade_DrawBorder(Class,Obj,rp,pn,simple_flags);
  254.  
  255.    LOD -> LastDrawn = FV_Shade_LastDrawn_Inactive;
  256. }
  257. //+
  258.  
  259.